【アップデート】Timestreamで複数テーブルのJOINや高度な時系列関数が利用可能になりました
CX事業本部@大阪の岩田です。少し時間が空いてしまいましたが、先日のアップデートによりTimestreamで複数テーブルのJOINや高度な時系列関数が利用可能になりました。今回のアップデートについて改めて紹介させて頂きます。
アップデート内容
上記AWSブログで紹介されているように、Timestreamのクエリエンジンにいくつかアップデートが入っています。1つずつ順を追って見ていきましょう。
複数テーブルのJOINやUNIONに対応
従来Timestreamのクエリでサポートされていた結合処理は自己結合(SELF JOIN)のみでした。今回のアップデートによりテーブルAとテーブルBを結合するようなクエリが実行可能になりました。同様にUNIONについても複数テーブルに対するクエリをUNION可能になりました。
TimestreamのサンプルDBを利用して複数テーブルのJOINとUNIONを試してみましょう。
まずはJOINから。全然無関係なテーブルがCROSS JOINされるメチャクチャなクエリですが、以下のクエリを実行してみました。
SELECT A.fleet, A.truck_id, B.hostname, B.az, B.region FROM (SELECT * FROM "sample-db"."IoT" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5) A LEFT OUTER JOIN (SELECT * FROM "sample-db"."DevOps" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5) B ON 1 = 1
実行結果です。
fleet | truck_id | hostname | az | region |
---|---|---|---|---|
Alpha | 2759574409 | host-Sr3H2 | us-west-1c | us-west-1 |
Alpha | 2759574409 | host-pZmEP | us-west-2b | us-west-2 |
Alpha | 2759574409 | host-penQN | us-east-1a | us-east-1 |
Alpha | 2759574409 | host-5uCmL | eu-north-1b | eu-north-1 |
Alpha | 2759574409 | host-9uNS5 | eu-central-1b | eu-central-1 |
Alpha | 683993576 | host-Sr3H2 | us-west-1c | us-west-1 |
Alpha | 683993576 | host-pZmEP | us-west-2b | us-west-2 |
Alpha | 683993576 | host-penQN | us-east-1a | us-east-1 |
Alpha | 683993576 | host-5uCmL | eu-north-1b | eu-north-1 |
Alpha | 683993576 | host-9uNS5 | eu-central-1b | eu-central-1 |
Alpha | 9355060257 | host-Sr3H2 | us-west-1c | us-west-1 |
Alpha | 9355060257 | host-pZmEP | us-west-2b | us-west-2 |
Alpha | 9355060257 | host-penQN | us-east-1a | us-east-1 |
Alpha | 9355060257 | host-5uCmL | eu-north-1b | eu-north-1 |
Alpha | 9355060257 | host-9uNS5 | eu-central-1b | eu-central-1 |
Alpha | 7219245711 | host-Sr3H2 | us-west-1c | us-west-1 |
Alpha | 7219245711 | host-pZmEP | us-west-2b | us-west-2 |
Alpha | 7219245711 | host-penQN | us-east-1a | us-east-1 |
Alpha | 7219245711 | host-5uCmL | eu-north-1b | eu-north-1 |
Alpha | 7219245711 | host-9uNS5 | eu-central-1b | eu-central-1 |
Alpha | 923079148 | host-Sr3H2 | us-west-1c | us-west-1 |
Alpha | 923079148 | host-pZmEP | us-west-2b | us-west-2 |
Alpha | 923079148 | host-penQN | us-east-1a | us-east-1 |
Alpha | 923079148 | host-5uCmL | eu-north-1b | eu-north-1 |
Alpha | 923079148 | host-9uNS5 | eu-central-1b | eu-central-1 |
IoTのサンプルデータとDevOpsのサンプルテーブル2つのテーブルがJOINできていることが分かります。
続いてUNIONも試してみます。
SELECT time, measure_name FROM (SELECT time,measure_name FROM "sample-db"."IoT" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5) UNION (SELECT time,measure_name FROM "sample-db"."DevOps" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5)
実行結果です。
time | measure_name |
---|---|
2021-02-13 05:38:14.756000000 | speed |
2021-02-13 05:37:20.008000000 | load |
2021-02-13 05:38:37.143000000 | load |
2021-02-13 05:38:46.975000000 | speed |
2021-02-13 05:38:22.730000000 | memory_utilization |
2021-02-13 05:38:17.068000000 | cpu_utilization |
2021-02-13 05:38:24.517000000 | cpu_utilization |
2021-02-13 05:38:12.745000000 | cpu_utilization |
2021-02-13 05:38:25.691000000 | cpu_utilization |
2021-02-13 05:38:55.976000000 | location |
IoTのサンプルデータとDevOpsのサンプルテーブル2つのテーブルからSELECTした結果がUNIONできていますね。
クエリでスキャンされたデータ量が確認可能に
Timestreamのクエリはスキャンされたデータ量に対して課金されます。これまではクエリ実行毎にスキャンされたデータ量を知ることができず、クエリの料金を正確に見積もることが困難でした。今回のアップデートによりスキャンされたデータ量が簡単に確認できるようになりました。
これで月額利用費の見積もりなど大分やりやすくなったのではないでしょうか?
よくよく調べるとAPI自体は2020/11/23時点で更新されていたので、これまでアナウンスされていなかっただけで、実は結構前から確認可能になっていたのかもしれません。
https://awsapichanges.info/archive/changes/d2b896-query.timestream.html
昨年末にDynamoDBとTimestreamの比較記事を書いた時点ではスキャンされたデータ量は確認できなかったような記憶があるのですが...正確なところはちょっと自信が無いです。
高度な時系列関数の追加
Timestreamの特徴でもある時系列関数ですが、新たに利用可能な関数が増えました。手元に残っていたメモと比較する限り、今回のアップデートによって追加された時系列関数は以下のようです。
※具体的にどの関数が追加されたという公式のソースが見つからず、最新ドキュメントと私の手元のメモとの比較になります。もし間違いなどあればご指摘下さいm(_ _)m
Function | Output data type | Description |
---|---|---|
correlate_spearman(timeseries, timeseries) |
double | Calculates Spearman's correlation coefficient for the two timeseries .The timeseries must have the same timestamps. |
filter(timeseries(T), function(T, Boolean)) |
timeseries(T) | Constructs a time series from an the input time series, using values for which the passed function returns true . |
reduce(timeseries(T), initialState S, inputFunction(S, T, S), outputFunction(S, R)) |
R | Returns a single value, reduced from the time series. The inputFunction will be invoked on each element in timeseries in order.In addition to taking the current element, inputFunction takes the current state (initially initialStats ) and returns the new state. The outputFunction will be invoked to turn the final state into the result value. The outputFunction can be an identity function. |
correlate_spearman
はいわゆるスピアマンの順位相関係数ですね。filter
とreduce
に関しては多くのプログラミング言語で同等の機能が実装されているので、普段からプログラムを書いている人であればスムーズに理解が進むと思います。
JDBCドライバーのソースコードがGitHubで公開
Timestream本体の機能拡張では無いですがTimestream向けのJDBCドライバがGitHub上で公開されました。ライセンス形体はApache 2.0ライセンスとなっており、Timestreamを利用するディベロッパーが機能追加や機能拡張に貢献できるようになりました。
https://github.com/awslabs/amazon-timestream-driver-jdbc
まとめ
TimestreamがGAされて以後はじめてのアップデートですね。今後も色々な機能が拡張されていくことに期待したいです。